package com.sy.simpleegg.app

import android.app.Activity
import android.app.Application
import android.content.Context
import android.os.Bundle
import android.os.Environment
import android.util.Log
import com.sy.logger.AndroidLogAdapter
import com.sy.logger.CsvFormatStrategy
import com.sy.logger.DiskLogAdapter
import com.sy.logger.FormatStrategy
import com.sy.logger.Logger
import com.sy.logger.PrettyFormatStrategy
import com.sy.simpleegg.crashhandler.CrashHandler
import com.sy.simpleegg.util.BoardApiUtil
import com.sy.simpleegg.util.MultiLanguageUtils
import com.sy.simpleegg.util.Utils
import com.ych.coinsdk.config.App
import me.jessyan.autosize.AutoSize
import me.jessyan.autosize.AutoSizeConfig
import me.jessyan.autosize.onAdaptListener
import me.jessyan.autosize.utils.AutoSizeLog
import java.io.File
import java.util.Locale
import kotlin.properties.Delegates

class App : App() {

    companion object {
        val TAG = "currency"

        var context: Context by Delegates.notNull()
            private set

        lateinit var instance: Application

    }

    override fun onCreate() {
        super.onCreate()
        instance = this
        Utils.init(instance)
//        registerActivityLifecycleCallbacks(mActivityLifecycleCallbacks)
        registerActivityLifecycleCallbacks(MultiLanguageUtils.callbacks)
        initLog()
        initDb()
        initCrashCatch()
        initAutoSize()
        initBoardApi()
    }

    private fun initBoardApi() {
//        checkBoardType();
//        ZtlManager.GetInstance().setContext(getApplicationContext());
        BoardApiUtil.setContext(applicationContext)
    }

    private fun initLog(){
        if (false) {
            val formatStrategy: FormatStrategy = PrettyFormatStrategy.newBuilder()
                .showThreadInfo(true) // (Optional) Whether to show thread info or not. Default true
                .methodCount(4) // (Optional) How many method line to show. Default 2
                .methodOffset(7) // (Optional) Hides internal method calls up to offset. Default 5
                //                      .logStrategy(customLog) // (Optional) Changes the log strategy to print out. Default LogCat
                //                      .tag("My custom tag")   // (Optional) Global tag for every log. Default PRETTY_LOGGER
                .build()
            Logger.addLogAdapter(AndroidLogAdapter(formatStrategy))
        } else {
            val diskPath = Environment.getExternalStorageDirectory().absolutePath
            val folder = diskPath + File.separatorChar + "logger"
            Log.d(javaClass.simpleName, "日志目录：$folder")
            val formatStrategy: FormatStrategy = CsvFormatStrategy.newBuilder()
                .filePath(folder) //                .tag("custom")
                .build()
            Logger.addLogAdapter(DiskLogAdapter(formatStrategy))
        }
    }

    private fun initDb(){
//        RoomUtil.start()
    }

    private fun initAutoSize() {
        //当 App 中出现多进程, 并且您需要适配所有的进程, 就需要在 App 初始化时调用 initCompatMultiProcess()
        //在 Demo 中跳转的三方库中的 DefaultErrorActivity 就是在另外一个进程中, 所以要想适配这个 Activity 就需要调用 initCompatMultiProcess()
        AutoSize.initCompatMultiProcess(this)

        //如果在某些特殊情况下出现 InitProvider 未能正常实例化, 导致 AndroidAutoSize 未能完成初始化
        //可以主动调用 AutoSize.checkAndInit(this) 方法, 完成 AndroidAutoSize 的初始化后即可正常使用
//        AutoSize.checkAndInit(this);

//        如何控制 AndroidAutoSize 的初始化，让 AndroidAutoSize 在某些设备上不自动启动？https://github.com/JessYanCoding/AndroidAutoSize/issues/249
        /**
         * 以下是 AndroidAutoSize 可以自定义的参数, [AutoSizeConfig] 的每个方法的注释都写的很详细
         * 使用前请一定记得跳进源码，查看方法的注释, 下面的注释只是简单描述!!!
         */
        AutoSizeConfig.getInstance() //是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
            //如果没有这个需求建议不开启
            .setCustomFragment(true) //是否屏蔽系统字体大小对 AndroidAutoSize 的影响, 如果为 true, App 内的字体的大小将不会跟随系统设置中字体大小的改变
            //如果为 false, 则会跟随系统设置中字体大小的改变, 默认为 false
            //                .setExcludeFontScale(true)
            //区别于系统字体大小的放大比例, AndroidAutoSize 允许 APP 内部可以独立于系统字体大小之外，独自拥有全局调节 APP 字体大小的能力
            //当然, 在 APP 内您必须使用 sp 来作为字体的单位, 否则此功能无效, 不设置或将此值设为 0 则取消此功能
            //                .setPrivateFontScale(0.8f)
            //屏幕适配监听器
            .setOnAdaptListener(object : onAdaptListener {
                override fun onAdaptBefore(target: Any, activity: Activity) {
                    //使用以下代码, 可以解决横竖屏切换时的屏幕适配问题
                    //使用以下代码, 可支持 Android 的分屏或缩放模式, 但前提是在分屏或缩放模式下当用户改变您 App 的窗口大小时
                    //系统会重绘当前的页面, 经测试在某些机型, 某些情况下系统不会主动重绘当前页面, 所以这时您需要自行重绘当前页面
                    //ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application!!!
//                        AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
//                        AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
                    AutoSizeLog.d(
                        String.format(
                            Locale.ENGLISH,
                            "%s onAdaptBefore!",
                            target.javaClass.name
                        )
                    )
                }

                override fun onAdaptAfter(target: Any, activity: Activity) {
                    AutoSizeLog.d(
                        String.format(
                            Locale.ENGLISH,
                            "%s onAdaptAfter!",
                            target.javaClass.name
                        )
                    )
                }
            }) //是否打印 AutoSize 的内部日志, 默认为 true, 如果您不想 AutoSize 打印日志, 则请设置为 false
        //                .setLog(false)
        //是否使用设备的实际尺寸做适配, 默认为 false, 如果设置为 false, 在以屏幕高度为基准进行适配时
        //AutoSize 会将屏幕总高度减去状态栏高度来做适配
        //设置为 true 则使用设备的实际屏幕高度, 不会减去状态栏高度
        //在全面屏或刘海屏幕设备中, 获取到的屏幕高度可能不包含状态栏高度, 所以在全面屏设备中不需要减去状态栏高度，所以可以 setUseDeviceSize(true)
        //                .setUseDeviceSize(true)
        //是否全局按照宽度进行等比例适配, 默认为 true, 如果设置为 false, AutoSize 会全局按照高度进行适配
        //                .setBaseOnWidth(false)
        //设置屏幕适配逻辑策略类, 一般不用设置, 使用框架默认的就好
        //                .setAutoAdaptStrategy(new AutoAdaptStrategy())
        //        customAdaptForExternal();
    }

    private fun initCrashCatch() {
        val crashHandler = CrashHandler()
        val diskPath = Environment.getExternalStorageDirectory().absolutePath
        val folder = diskPath + File.separatorChar + "logger"
        crashHandler.init(this, folder)
    }

    private val mActivityLifecycleCallbacks = object : ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
            Log.d(TAG, "onCreated: " + activity.componentName.className)
        }

        override fun onActivityStarted(activity: Activity) {
            Log.d(TAG, "onStart: " + activity.componentName.className)
        }

        override fun onActivityResumed(activity: Activity) {

        }

        override fun onActivityPaused(activity: Activity) {

        }

        override fun onActivityStopped(activity: Activity) {

        }

        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {

        }

        override fun onActivityDestroyed(activity: Activity) {
            Log.d(TAG, "onDestroy: " + activity.componentName.className)
        }
    }

}